其他
【10-7】做数据分析,要不要掌握Linux系列:shell编程之文档操作(2)
1、grep命令
-c:统计符合条件的字符串出现的总行数。
-E:支持扩展正则表达式。
-i:忽略字符大小写。
-n:在显示匹配到的字符串前面加上行号。
-v:显示没有”搜索字符串”内容的那一行。
-l:列出文件内容中有搜索字符串的文件名称。
-o:只输出文件中匹配到的部分。
-color=auto:将匹配到的字符串高亮出来。
1)基本使用 // 这个不太好总结出来,自己慢慢体会就好啦!
# 第一种写法
# 注:这个只能是搜索文件中的指定字符。如果是文件夹则会报错
grep 字符 文件:从文件中搜索并打印找到行。
# 第二种写法:常用是这种
文件/文件夹 | grep 字符:从流中获取并输出找到的行。
[hadoop@image1 shell]$ ls
a.sh b.txt compare.sh file.sh if-elif-else.sh list1.sh services.sh test.sh uni.sh while.sh
a.txt cacul.sh c.txt func1.sh if-else.sh list.sh sort.txt three.sh until.sh
bool.sh case.sh cut.txt func2.sh if.sh read.sh str.sh uniq.txt wc.txt
# 查找某一个指定文件
[hadoop@image1 shell]$ ll | grep a.txt
-rw-rw-r--. 1 hadoop hadoop 10 Oct 25 12:41 a.txt
# 查看某一个指定进程
[hadoop@image1 shell]$ ps aux | grep sshd
root 2225 0.0 0.0 66260 1208 ? Ss 09:32 0:00 /usr/sbin/sshd
root 2464 0.0 0.2 102104 4048 ? Ss 09:32 0:00 sshd: hadoop [priv]
hadoop 2468 0.0 0.0 102104 1896 ? R 09:32 0:01 sshd: hadoop@pts/0
hadoop 3495 0.0 0.0 103336 848 pts/0 S+ 13:39 0:00 grep sshd
# 查看是否安装了某一个指定的软件
[hadoop@image1 shell]$ rpm -qa | grep -i jdk
2)正则表达式的使用
2、find命令功能:搜索文件目录层次结构
-name 根据文件名查找,支持('* ' , '? ')
-type 根据文件类型查找(f-普通文件,c-字符设备文件,b-块设备文件,l-链接文件,d-目录)
-perm 根据文件的权限查找,比如 755
-user 根据文件拥有者查找
-group 根据文件所属组寻找文件
-size 根据文件小大寻找文件
-o 表达式 或
-a 表达式 与
-not 表达式 非
[hadoop@image1 txt]$ ll
total 248
-rw-rw-r--. 1 hadoop hadoop 235373 Apr 18 00:10 hw.txt
-rw-rw-r--. 1 hadoop hadoop 0 Apr 22 05:43 HADOOP.pdf
-rw-rw-r--. 1 hadoop hadoop 3 Apr 22 05:50 liujialing.jpg
-rw-rw-r--. 1 hadoop hadoop 0 Apr 22 05:43 mingxing.pdf
-rw-rw-r--. 1 hadoop hadoop 57 Apr 22 04:40 mingxing.txt
-rw-rw-r--. 1 hadoop hadoop 66 Apr 22 05:15 sort.txt
-rw-rw-r--. 1 hadoop hadoop 214 Apr 18 10:08 test.txt
-rw-rw-r--. 1 hadoop hadoop 24 Apr 22 05:27 uniq.txt
## 1、查找文件名txt结尾的文件
find /home/hadoop/txt/ -name "*.txt"
/home/hadoop/txt/uniq.txt
/home/hadoop/txt/mingxing.txt
/home/hadoop/txt/test.txt
/home/hadoop/txt/hw.txt
/home/hadoop/txt/sort.txt
## 2、忽略大小写,查找文件名包含hadoop
find /home/hadoop/txt -iname "*hadoop*"
/home/hadoop/txt/HADOOP.pdf
## 3、查找文件名结尾是.txt或者.jpg的文件
find /home/hadoop/txt/ \( -name "*.txt" -o -name "*.jpg" \)
/home/hadoop/txt/liujialing.jpg
/home/hadoop/txt/uniq.txt
/home/hadoop/txt/mingxing.txt
/home/hadoop/txt/test.txt
/home/hadoop/txt/hw.txt
/home/hadoop/txt/sort.txt
另一种写法:
find /home/hadoop/txt/ -name "*.txt" -o -name "*.jpg"
## 4、使用正则表达式的方式,去查找上面条件的文件
find /home/hadoop/txt/ -regex ".*\(\.txt\|\.jpg\)$"
/home/hadoop/txt/liujialing.jpg
/home/hadoop/txt/uniq.txt
/home/hadoop/txt/mingxing.txt
/home/hadoop/txt/test.txt
/home/hadoop/txt/hw.txt
/home/hadoop/txt/sort.txt
## 5、查找.jpg结尾的文件,然后删掉
find /home/hadoop/txt -type f -name "*.jpg" -delete
[hadoop@hadoop txt]$ ll
total 248
-rw-rw-r--. 1 hadoop hadoop 235373 Apr 18 00:10 hw.txt
-rw-rw-r--. 1 hadoop hadoop 0 Apr 22 05:43 HADOOP.pdf
-rw-rw-r--. 1 hadoop hadoop 0 Apr 22 05:43 mingxing.pdf
-rw-rw-r--. 1 hadoop hadoop 57 Apr 22 04:40 mingxing.txt
-rw-rw-r--. 1 hadoop hadoop 66 Apr 22 05:15 sort.txt
-rw-rw-r--. 1 hadoop hadoop 214 Apr 18 10:08 test.txt
-rw-rw-r--. 1 hadoop hadoop 24 Apr 22 05:27 uniq.txt
3、shell操作字符串
1)字符串截取
下面为大家介绍几种常用方式,截取字符串。
结果:hadoop//centos/huangbo.html
结果:centos/huangbo.html
结果:http://hadoop
结果:http:
% 去掉右边,最短匹配模式, %%最长匹配模式。
注意:他们两个的写法还有点不同。
去掉左边,使用的是#,同时*在字符左边;
去掉右边,使用的是%,同时*在字符右边;
tp
tp://hadoop//centos//huangbo.html
ht
html
ttp://
http
[hadoop@image1 ~]# echo $website | cut -c 1-4
http
[hadoop@image1 ~]# echo $website | cut -b 1,4
hp
[hadoop@image1 ~]# echo $website | cut -c 1,4
hp
tml
tm
2)字符串替换
${parameter/pattern/string}
[hadoop@image1 ~]# var="hello tom, hello kitty, hello xiaoming"
# 替换第一个hello
[hadoop@image1 ~]# echo ${var/hello/hi}
hi tom, hello kitty, hello xiaoming
# 替换所有hello
[hadoop@image1 ~]# echo ${var//hello/hi}
hi tom, hi kitty, hi xiaoming
3)获取字符串长度
Ⅰ 通过#的方式获取字符串(最简单,最常用)
35
Ⅱ 使用wc -L命令
35
Ⅲ 使用expr的方式去计算
35
Ⅳ 通过awk + length的方式获取字符串长度
35
Ⅴ 通过awk的方式计算以""分隔的字段个数
35
4、sed命令功能
5、awk命令功能
# 注意:下面一定是单引号,不能是双引号。
查找的结果 | awk -F分隔符 'print $1'
root
bin
daemon
adm
lp
[hadoop@image1 ~]# cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
[hadoop@image1 ~]# cat /etc/passwd | awk -F ':' '{print $1","$7}'
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
[hadoop@image1 ~]# cat /etc/passwd | awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
blue,/bin/nosh